package win.bitterwine.util;


import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

/**
 * @author wangqingyu
 */
public class PublicTool {

    public static String getCacheOneKey(Class<?> entityClass, String condition, Object... params){
        String str = "";
        if(!StringUtils.isEmpty(condition) && condition.equals("id=?")){
            String key = getsubTableName(entityClass.getName());
            str = key+"_"+params[0];
        }else{
            str = "one"+getCacheCommonKey(entityClass, condition, params);
        }
        return str;
    }


    /**
     * 根据查询条件获取存在redis中的key
     * @return
     */
    public static String getCacheCommonKey(Class<?> entityClass, String condition, Object... params){
        String key = getTableBeanName(entityClass.getName());
        key += StringUtils.defaultString(condition);
        if( !ArrayUtils.isEmpty(params) ){
            for(Object object : params){
                key += object.toString();
            }
        }
        return key;
    }

    /**
     * 根据查询条件获取存在redis中的key
     * @param entityClass
     * @param condition
     * @param sort
     * @param params
     * @return
     */
    public static String getCacheSelectListKey(Class<?> entityClass, String condition, String sort, Object... params){
        String key = getTableBeanName(entityClass.getName());
        key += StringUtils.defaultString(condition);
        key += StringUtils.defaultString(sort);
        if( !ArrayUtils.isEmpty(params) ){
            for(Object object : params){
                key += object.toString();
            }
        }
        return key;
    }

    /**
     * 根据数据类型获得clazz对象
     *
     * @param type
     * @return
     */
    public static Class<?> getMultiClass(String type) {
        Class<?> clazz = null;
        switch (type) {
            case "java.lang.Integer":
                clazz = Integer.class;
                break;
            case "int":
                clazz = int.class;
                break;
            case "long":
                clazz = long.class;
                break;
            case "java.lang.Long":
                clazz = Long.class;
                break;
            case "java.lang.String":
                clazz = String.class;
                break;
            case "java.util.Date":
                clazz = Date.class;
                break;
            case "java.sql.Date":
                clazz = java.sql.Date.class;
                break;
            case "java.lang.Float":
                clazz = Float.class;
                break;
            case "float":
                clazz = float.class;
                break;
            case "java.lang.Double":
                clazz = Double.class;
                break;
            case "double":
                clazz = double.class;
                break;
            case "char":
                clazz = char.class;
                break;
            case "java.lang.Character":
                clazz = Character.class;
                break;
            default:
                try {
                    clazz = Class.forName(type);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
        }
        return clazz;
    }

    /**
     * 根据类对象获取该对象的变量及类型
     */
    public static Map<String, String> getFiledsMap(Class<?> cls){
        Map<String, String> map = new HashMap<>();
        Field[] fields = cls.getDeclaredFields();
        System.out.println(fields.length);
        for(Field field : fields){
            System.out.println(field.getName());
            map.put(field.getName(),field.getType().toString());
        }
        return map;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> cls = Class.forName("win.bitterwine.entity.B_roles");
        System.out.println(getFiledsMap(cls));
    }

    /**
     * 执行获得所有的get方法
     *
     * @param clazz obj的class对象
     * @return
     */
    public static List<Object> getGetMethod(Class<?> clazz, Object obj)
            throws Exception {
        List<String> list = new ArrayList<String>();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            String meString = method.getName();
            if (meString.startsWith("get")) {
                list.add(meString);
            }
            Collections.sort(list);
        }
        List<Object> temp = new ArrayList<Object>();
        for (int i = 0; i < list.size(); i++) {
            Method method2 = clazz.getMethod(list.get(i), new Class[]{});
            Object result = method2.invoke(obj, new Object[]{});
            if (result == null) {
                temp.add(null);
            } else {
                temp.add(result);
            }
        }
        return temp;
    }

    /**
     * 获得所有的set方法
     *
     * @param clazz obj的class对象
     * @return 返回 方法名 和 参数类型
     */
    public static List<String> getSetMethod(Class<?> clazz) {
        List<String> list = new ArrayList<String>();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            String meString = method.getName();
            if (meString.startsWith("set")) {
                Class[] mClass = method.getParameterTypes();
                String type = mClass[0].getName();
                list.add(meString + "@" + type);
            }
        }
        Collections.sort(list);
        return list;
    }

    /**
     * 获取所有符合条件的字段
     *
     * @author wqy
     * @date 2017年3月20日 下午1:41:30
     */
    public static List<String> getRightField(Field[] fields) {
        List<String> list = new ArrayList<String>();
        for (Field field : fields) {
            String type = field.getType().toString();
            list.add(field.getName());
        }
        Collections.sort(list);
        return list;
    }

    /**
     * 获取该类的所有符合条件得get方法的名字
     *
     * @author wqy
     * @date 2017年3月20日 下午3:24:02
     */
    public static List<String> getGetMeth(Class<?> clazz) {
        List<String> list = new ArrayList<String>();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            String meString = method.getName();
            if (meString.startsWith("get")) {
                list.add(method.getName());
            }
        }
        Collections.sort(list);
        return list;
    }

    /**
     * 获得符合规则的set方法
     *
     * @param clazz
     * @return
     * @author wqy
     * @date 2017年3月21日 上午10:58:05
     */
    public static List<String> getSetMeth(Class<?> clazz) {
        List<String> list = new ArrayList<String>();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            String meString = method.getName();
            if (meString.startsWith("set")
                    && !(method.toString().contains("Set")) ) {
                Class<?>[] cc = method.getParameterTypes();
                list.add(method.getName() + "@" + cc[0].getName());
            }
        }
        Collections.sort(list);
        return list;
    }

    /**
     * 根据全类名 获取要存入redis的简单的名字 T_module ---> module
     *
     * @param className
     * @return
     * @author wqy
     * @date 2017年3月22日 上午9:25:32
     */
    public static String getsubTableName(String className) {
        return className.substring(className.lastIndexOf("_") + 1);
    }

    /**
     * 根据全类名,获取 bean的名字
     *
     * @param className
     * @return
     * @author wqy
     * @date 2017年3月22日 上午11:39:42
     */
    public static String getTableBeanName(String className) {
        return className.substring(className.lastIndexOf(".") + 1);
    }

    /**
     * 将字符串的首字母变大写返回
     *
     * @return
     */
    public static String getInitialUpperName(String str) {
        str = str.substring(0, 1).toUpperCase() + str.substring(1);
        return str;
    }

    /**
     * 将字符串的首字母变大写返回
     *
     * @return
     */
    public static String getInitialLowerName(String str) {
        str = str.substring(0, 1).toLowerCase() + str.substring(1);
        return str;
    }

}
